package org.powernode.spring6.service;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

//使用的是class，底层使用cglib的方式去实现，使用继承的方式
@Component("logAspect")
@Aspect
@Order(1)
public class LogAspect { //切面
    //切面=通知+切点
    //通知就是增强，就是具体的要编写的增强代码。@Before:前置通知
    //切点表达式格式：execution(修饰符 返回值类型 全限定类名 方法名(形式参数列表) 异常)
    //                       空(不限制)  * 所有都行          *表示所有方法(.. 不限制)
//    @Before("execution(* org.powernode.spring6.service.UserService.*(..))")
    //                                            下面两个点表示它的包和它的子包下所有的类
    //@Before  //前置通知
    //@AfterReturning  //后置通知
    //@Around  //环绕通知
    //@AfterThrowing  //异常通知
    //@After  //最终通知
    @Before("org.powernode.spring6.service.AspectPoint.common()")
    public void beforeAdvice() {
        System.out.println("前置通知");
    }

    //后置通知
    @AfterReturning("org.powernode.spring6.service.AspectPoint.common()")
    public void afterReturningAdvice() {
        System.out.println("后置通知");
    }

    //环绕通知
    @Around("org.powernode.spring6.service.AspectPoint.common()")
    public void aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("前环绕");
        joinPoint.proceed();
        System.out.println("后环绕");
    }

    @AfterThrowing("org.powernode.spring6.service.AspectPoint.common()")
    public void afterThrowingAdvice() {
        System.out.println("异常通知");
    }

    //最终通知
    @After("org.powernode.spring6.service.AspectPoint.common()")
    public void afterAdvice() {
        System.out.println("最终通知");
    }

    //一个切面的所有通知顺序
    //前环绕
    //前置通知
    //方法执行
    //后置通知
    //最终通知
    //后环绕

    //出现异常的话，就没有后环绕，其他都有
}
